/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.dommages.services.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Service;

import fr.generali.accueilclient.commun.exception.AccueilClientBusinessException;
import fr.generali.accueilclient.dommages.factory.AbstractRechercheSitesProductionUtilisateurFactory;
import fr.generali.accueilclient.dommages.om.ICriteresRechercheSiteProductionUtilisateur;
import fr.generali.accueilclient.dommages.om.impl.DTOSiteProductionTosca;
import fr.generali.accueilclient.dommages.services.IRechercheSitesProductionUtilisateurService;
import fr.generali.souscriptiongestion.dommages.tosca.recherchersitesproductionutilisateur.services.IRechercherSitesProductionUtilisateurWebService;
import fr.generali.souscriptiongestion.dommages.tosca.recherchersitesproductionutilisateur.demande.DTODemande;
import fr.generali.souscriptiongestion.dommages.tosca.recherchersitesproductionutilisateur.services.RechercherSitesProductionUtilisateurException;
import fr.generali.souscriptiongestion.dommages.tosca.recherchersitesproductionutilisateur.reponse.DTOReponse;
import fr.generali.souscriptiongestion.dommages.tosca.recherchersitesproductionutilisateur.wam.traceaudit.DTOSiteProduction;

/**
 * @author Holmes Kelly
 */

@Service
public class RechercheSitesProductionUtilisateurService extends AbstractRechercheSitesProductionUtilisateurFactory implements
                IRechercheSitesProductionUtilisateurService {

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(RechercheSitesProductionUtilisateurService.class);

    /**
     * 
     */
    @Autowired
    private IRechercherSitesProductionUtilisateurWebService rechercherSitesProductionUtilisateurWebService;

    /**
     * 
     */
    @Autowired
    @Qualifier("sitesProductionUtilisateurConverter")
    private Converter<DTOSiteProduction, DTOSiteProductionTosca> sitesProductionUtilisateurConverter;

    /**
     * {@inheritDoc}
     */
    public List<DTOSiteProductionTosca> rechercherSitesProductionUtilisateur(
        ICriteresRechercheSiteProductionUtilisateur criteresRechercheSiteProductionUtilisateur)
        throws AccueilClientBusinessException {

        List<DTOSiteProductionTosca> result = null;

        DTODemande criteres = null;

        if (criteresRechercheSiteProductionUtilisateur != null) {

            criteres = new DTODemande();

            try {

                copyProperties(criteresRechercheSiteProductionUtilisateur, criteres);

                DTOReponse reponse =
                                rechercherSitesProductionUtilisateurWebService
                                                .rechercherSitesProductionUtilisateur(criteres);

                List<DTOSiteProduction> sitesProduction = reponse == null ? null : reponse.getSitesProduction();

                if (sitesProduction != null && !sitesProduction.isEmpty()) {

                    result = new ArrayList<DTOSiteProductionTosca>();

                    CollectionUtils.collect(sitesProduction, getTransformerSiteProductionUtilisateur(), result);

                }

            } catch (RechercherSitesProductionUtilisateurException e) {

                LOGGER.debug(e.getMessage());

                throw new AccueilClientBusinessException(e.getMessage(), e);

            }
        }

        return result;
    }

    /**
     * @return transformer DTOSiteProduction
     */
    private Transformer getTransformerSiteProductionUtilisateur() {

        Transformer transformer = new Transformer() {

            public Object transform(Object input) {

                DTOSiteProduction siteProduction = (DTOSiteProduction ) input;

                return sitesProductionUtilisateurConverter.convert(siteProduction);
            }
        };

        return transformer;
    }

}
